package com.fr.lavollepic.gbdroid;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.KeyStore.LoadStoreParameter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringEscapeUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.MenuItem.OnMenuItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class GBrssreader extends Activity {
    /** Called when the activity is first created. */
    
    //balises
    static String ITEM = "item";
    static String TITLE="title";
    static String DESCRIPTION="description";
    static String PUBDATE="pubDate";
    //Regex de nettoyage des résultats du parsing
	static String REGEX="[0-9a-zA-ZàÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ'ñ@\\.\'\\ ]";
	static String STARTCHAIN="(googleadsectionstart\\ p)";
	static String ENDCHAIN="(p\\ googleadsectionend)";
	static String EMPTYCHAIN="googleadsectionstart\\  googleadsectionend";
	//booleen de chargement des données
	static boolean loaded=false;
	static boolean refresh=false;
	//menu id
	public static final int MENUID_ONE= Menu.FIRST+1;
    //Listview
     ListView mListView;
     //liste des items
     static ArrayList<HashMap<String, String>> itemList = new ArrayList<HashMap<String,String>>();

     //déclaration de la progressdialog
     ProgressDialog mProgressDialog;
     
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.gbrssreader);  	
    	//on reuperation de la listView;
		mListView = (ListView) findViewById(R.id.listViewFeed);
    	if(!loaded||refresh){
			//Traitement du flux RSS
	    	parseflux();
	    	//On marque une pause
	    	try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			afficheFeed(this.getBaseContext(),mListView,itemList);
			loaded=true;
    	} else {
    		afficheFeed(this.getBaseContext(),mListView,itemList);
    		refresh=false;
    	}
        
    }

    /**
     * private void afficheFeed()
     * Affiche les éléments du parsing contenu dans L'ArrayList
     * dans un TextView de l'activité
     */
   public void afficheFeed(final Context context,final ListView list,  ArrayList<HashMap<String, String>> itemlist) {
	 final ArrayList<HashMap<String, String>> listcontent = itemlist;
	  
	   new Thread((new Runnable() { //Creation d'un nouveau thread pour l'affichage
		
	
		public void run() {
			//Traitement de l'ArrayList "itemList" pour affichage
			//Adapter de la ListView pour remplissage
			SimpleAdapter rssAdaapter = new SimpleAdapter(context, listcontent, R.layout.itemfeed,new String[] {TITLE,DESCRIPTION,PUBDATE}, new int[] {R.id.titre,R.id.description,R.id.pubdate});
			  list.setAdapter(rssAdaapter);
		}
		})).start();
	   
	
   }
    /**==========================================================
     * private void parseFlux()
     * parsing du flux rss et remplissage d'une Static ArrayList
     * Pour changer de flux : gbUrlBonPlan/gbUrlNewsFeed
     *===========================================================
     */
   public void parseflux () {
		
	   
	   try {
			//on recupere l'url des feed
			URL gbRssUrl = new URL(getString(R.string.gbUrlNewsFeed));
			InputStream gbRssUrlStream = gbRssUrl.openStream();
       		
		       
			XmlPullParserFactory factoryParse = XmlPullParserFactory.newInstance(); 
			XmlPullParser xpp = factoryParse.newPullParser();
			xpp.setInput(gbRssUrlStream, null);
	    	
			//etats
			int eventType = xpp.getEventType();
			//booleens
			boolean inItem=false;
			boolean inTitle=false;
			boolean inDescription=false;
			boolean inPubDate=false;
		    //cleanBuffer
			String cleanBuffer ="";
			//hashmap temporaire qui contiendra l'item
			HashMap<String, String> item = new HashMap<String, String>();
			
			while (eventType != XmlPullParser.END_DOCUMENT) { //On parcours le document tant que la fin n'est pas arrivée
				switch(eventType) { 
				case XmlPullParser.START_DOCUMENT: // DEBUT DU XML
					//itemList.add("----Début------\n");
					break;
					
				case XmlPullParser.START_TAG: //DETECTION OUVERTURE DE BALISE
					//Si une balise d'ouverture est rencontré on passe un booleen à true pour indique qu'on le traite.
					//Le booleen de l'item passe à true pour indiquer que l'on traite un item(title,description,pubdate)
					if (xpp.getName().equalsIgnoreCase(ITEM)) { 
						inItem=true;
					//si un item est en cours et qu'un éléments est détecté son booleen passe à true
					} else if ((inItem) && (xpp.getName().equalsIgnoreCase(TITLE))) {
						inTitle=true;
					} else if ((inItem) && (xpp.getName().equalsIgnoreCase(DESCRIPTION))) {
						inDescription=true;
					} else if ((inItem) && (xpp.getName().equalsIgnoreCase(PUBDATE))) {
						inPubDate=true;
					}
				
					
					break;
				
				case XmlPullParser.END_TAG: //DETECTION DE LA BALISE DE FERMETURE
					//Si l'élement de l'item "EN COURS" à été traité on passe le booleen de présence à false
				if ((inItem)&&(xpp.getName().equalsIgnoreCase(TITLE))) {
					inTitle=false;
				} else if ((inItem)&&(xpp.getName().equalsIgnoreCase(DESCRIPTION))) {
					inDescription=false;
				} else if ((inItem)&&(xpp.getName().equalsIgnoreCase(PUBDATE))) {
					inPubDate=false;
				} else if ((xpp.getName().equalsIgnoreCase(TITLE))&&(!inTitle)&&(!inDescription)&&(!inPubDate)) { //fin d'un item
					inItem=false;
					 
					
				}
			
				
				case XmlPullParser.TEXT: //DETECTION D'UN CONTENU ENTRE BALISES
					if ((inTitle)&&(!xpp.isWhitespace())) {
						item.put(TITLE,xpp.getText());
						
					} else if ((inDescription)&&(!xpp.isWhitespace())) {
						cleanBuffer = cleanChainFeed(xpp.getText());
						item.put(DESCRIPTION,cleanBuffer);
						cleanBuffer="";
					} else if ((inPubDate)&&(!xpp.isWhitespace())) {
						cleanBuffer = cleanDate(xpp.getText());
						item.put(PUBDATE,cleanBuffer);
						cleanBuffer="";
						itemList.add(item); //on ajoute l'item à l'ArrayList
						item = new HashMap<String, String>(); //on nettoie la hashmap;
					}
				
					break;
				
				case XmlPullParser.END_DOCUMENT:
					
					break;
				}
				eventType=xpp.next();
			}
		

		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		}
		

		
   }
   /**======================================================================================
    * cleanChainFeed : Nettoyage du HTML et "googladdsectionstart p","googleaddsectionend p"
    * @param in
    * @return
    *=======================================================================================*/
   public String cleanChainFeed(String in) {
		//Nettoyage du html
		String res="";
		StringBuffer buffclean = new StringBuffer();
		res=StringEscapeUtils.unescapeHtml(in);
		//Elimination des caract�res sp�ciaux
		Pattern p= Pattern.compile(REGEX); //On passe la regex � l'objet Pattern
		Matcher m = p.matcher(res); //reconnaissance du motif par le matcher
		while (m.find()) {
			buffclean.append(m.group());//tant que le motif est d�tect�(m.group()), on l'ajoute au buffer
		}
		res= buffclean.toString().replaceAll(STARTCHAIN, ""); //on supprime le bout de chaine non d�sir�e du debut
		res = res.replaceAll(ENDCHAIN, ""); //on supprime le bout de chaine non d�sir�e en fin
		res=res.replaceAll(EMPTYCHAIN, "");//Si �l�ment vide (googleadsectionstart  googleadsectionend ), on nettoie.
		
		return res;
	}
   /**==========================================================================================
    * cleanDate : Nettoyage d'une date (Sun, 20 Mar 2011 23:25:03 +0000), suppression de "+0000"
    * @param date
    * @return
    *=========================================================================================*/
	public static String cleanDate(String date){
		String res="";
		res = date.replaceAll("\\+0{4}", "");
		
		return res;
	}
	//=================================================================================
	// définition du menu
	//=================================================================================
	//création du menu au chargement de l'activite
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(0, MENUID_ONE, Menu.NONE, "Refresh").setIcon(android.R.drawable.ic_menu_rotate);
		
		return true;
	}
	//Actions au clic sur un bouton du menu
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case MENUID_ONE:
			refresh=true;
			onCreate(null);
			break;
		}
		return true;
	}
	
 
}